home *** CD-ROM | disk | FTP | other *** search
/ CD Actual 1 / PC Actual CD 01.iso / f1 / fractal.arj / FRACTAL.C < prev    next >
Encoding:
C/C++ Source or Header  |  1992-09-04  |  25.5 KB  |  976 lines

  1.  
  2. /***************************************************************************/
  3. /**  Francisco Javier Trujillo Horcas *************** 23 de Julio de 1992 **/
  4. /***************************************************************************/
  5. /*     Este fichero permite la representación del conjunto de Mandelbrot  **/
  6. /* y de sucesivas ampliaciones de una centesima parte de la imagen inicial.*/
  7. /***************************************************************************/
  8.  
  9.  
  10. #include <graphics.h>
  11. #include <stdio.h>
  12. #include <conio.h>
  13. #include <stdlib.h>
  14. #include <bios.h>
  15. #include <teclas.h>
  16. #include <dos.h>
  17. #include <ctype.h>
  18. #include <math.h>
  19. #include <dir.h>
  20. #define BEEP_CORTO         sound(600);delay(200);nosound()
  21.  
  22. void graba_dibujo(void);
  23.     /*Graba un fichero .IMG, imágen de una fractal.*/
  24.  
  25. void guarda_config(void);
  26.     /*Graba la situación del programa en un momento dado.*/
  27.  
  28. void repone_config(void);
  29.     /*Repone una determinada situación del programa, ya grabada.*/
  30.  
  31. void salida(char texto [80]);
  32.     /*Gestiona la salida del programa.*/
  33.  
  34. char
  35.     bucle_cad [3]="1";/*Contiene la cadena del número de imagen.*/
  36.  
  37. unsigned char
  38.     frac[30000],    /*Array que sirve para multiples almacenamientos.*/
  39.     limpia_texto[6500];    /*Limpia la linea de estado.*/
  40.  
  41. int
  42.     cuenta_vueltas=1,    /*Impide que el bucle tape a la primera imagen.*/
  43.     x_ventana=5,         /*Mantienen las posicion X e Y de cada imagen.*/
  44.     y_ventana=30,
  45.     bucle=1;             /*Controla el número de bucles hasta 20.*/
  46.  
  47. unsigned
  48.     num_char;                    /*Contiene el número de elementos de frac.*/
  49.  
  50. double
  51.     x_margen=-2,          /*Contienen X e Y de la mirilla a representar.*/
  52.     y_margen=-2,
  53.     intervalo=0.02,     /*Mantiene el intervalo de ajuste para cada punto.*/
  54.     ajuste_punto=50;  /*Ajusta el intervalo, para nuevos margenes.*/
  55.  
  56. FILE
  57.     *archivo;                    /*Gestiona todos los ficheros del programa.*/
  58.  
  59. union
  60.     {
  61.     int   i;
  62.     char  c;
  63.     }    tecla_pulsada;    /*Gestiona las pulsaciones del teclado.*/
  64.  
  65.  
  66. /***************************************************************************/
  67.  
  68.  
  69. void main(int argc,char *argv[])
  70. {
  71. register
  72.     x_pixel,            /*Contienen la posicion X e Y de pixels de la imagen.*/
  73.     y_pixel;
  74.  
  75. int
  76.     driver=VGA,         /*Carga el Driver para el modo grafico VGA.*/
  77.     modo=VGAHI,         /*Fuerza el modo grafico VGA de 640*480*/
  78.     conta_color,        /*Proporciona el color de cada pixel de la imagen.*/
  79.     num;                            /*Establece el número de comprobaciones por punto.*/
  80.  
  81. double
  82.     x_result,             /*Contienen el resultado de la X e Y de la función.*/
  83.     y_result,
  84.     x_rec,                        /*Mantienen la coordenada X e Y al mover la mirilla.*/
  85.     y_rec,
  86.     x_dato,           /*Almacenan los resultados de la función temporalmente.*/
  87.     y_dato,
  88.     x_coord=0,          /*Contienen la coordenada X e Y de cada punto.*/
  89.     y_coord=0;
  90.  
  91. /***************************************************************************/
  92. /* Prepara la pantalla de presentación y gestiona los argumentos de entrada*/
  93. /***************************************************************************/
  94.  
  95. switch(argc)
  96.     {
  97.     case 1:
  98.       num=200;
  99.       break;
  100.     case 2:
  101.       num=atoi(argv[1]);
  102.       break;
  103.     default:
  104.         salida("Sólo puede introducir un argumento, pruebe de nuevo.\n\n");
  105.       break;
  106.     };
  107.  
  108. if ((num>2000)||(num<10))
  109.     salida("El argumento esta fuera de margen. Debe estar entre los valores 10 y 2000.\n\n");
  110.  
  111. /***************************************************************************/
  112.  
  113. clrscr();
  114.  
  115. registerbgifont(triplex_font);
  116. registerbgifont(gothic_font);
  117. registerbgifont(DEFAULT_FONT);
  118. registerbgidriver(EGAVGA_driver);
  119.  
  120. initgraph(&driver, &modo,"");
  121.  
  122. settextstyle(GOTHIC_FONT,0,10);
  123. setcolor(9);
  124. outtextxy(130,120,"Fractal");
  125. settextstyle(DEFAULT_FONT,0,0);
  126. setcolor(14);
  127. settextstyle(TRIPLEX_FONT,0,8);
  128. outtextxy(40,20,"T");
  129. setcolor(9);
  130. circle(60,60,40);
  131. settextstyle(DEFAULT_FONT,0,1);
  132. setcolor(15);
  133. outtextxy(100,300,"Javier Trujillo-1992");
  134. outtextxy(230,450,"Pulse INTRO para continuar.");
  135.  
  136. while((tecla_pulsada.i=bioskey(0))!=INTRO)
  137.     putch('\a');
  138.  
  139. setwritemode(1);
  140. setviewport(5,0,639,479,1);
  141. getimage(1,465,628,475,limpia_texto);
  142.  
  143.  
  144. /***************************************************************************/
  145. /*       Presenta la primera imagen  junto con la pantalla de trabajo      */
  146. /***************************************************************************/
  147.  
  148.  
  149. cleardevice();
  150. rectangle(0,5,629,20);
  151. rectangle(0,25,629,477);
  152. rectangle(4,29,205,230);
  153. rectangle(214,29,415,230);
  154. rectangle(424,29,625,230);
  155. rectangle(4,249,205,450);
  156. rectangle(214,249,415,450);
  157. rectangle(424,249,625,450);
  158. line(1,462,628,462);
  159. setcolor(9);
  160.  
  161. num_char=(imagesize(0,0,199,199)/sizeof(char));
  162.  
  163. if((archivo = fopen("imagen1.dib","rb"))==NULL)
  164.     salida("No se puede abrir el fichero de la primera imágen, compruebe que existe.\n\n");
  165. if(fread(frac, sizeof(char) ,num_char,archivo)!=num_char)
  166.     {
  167.     if(feof(archivo))
  168.         salida("Fin de fichero prematuro al leer el archivo de la primera imágen.\n\n");
  169.     else
  170.         salida("Error de lectura en el archivo de la primera imágen.\n\n");
  171.     };
  172. putimage(5,30,frac,0);
  173. fclose(archivo);
  174.  
  175. rectangle(x_ventana+5,y_ventana+204,x_ventana+9,y_ventana+208);
  176. outtextxy(1,9,"  Imágen nº                                 FRACTAL    Javier Trujillo-1992");
  177. outtextxy(100,9,bucle_cad);
  178.  
  179. /**************************************************************************/
  180. /* Inicia el bucle principal del programa y gestiona las teclas pulsadas  */
  181. /**************************************************************************/
  182.  
  183.  
  184. for (;;)
  185.     {
  186.     putimage(1,465,limpia_texto,0);
  187.     outtextxy(1,466," F2-Guardar  F3-Reponer  F5-Elegir Mirilla  F8-Grabar Imágen  F10-Salir al DOS");
  188.  
  189.     for(;;)
  190.         {
  191.         tecla_pulsada.i=bioskey(0);
  192.         x_rec=89;
  193.         y_rec=89;
  194.         if ((tecla_pulsada.i==ESCAPE)||(tecla_pulsada.i==INTRO))
  195.             tecla_pulsada.i=1;
  196.         if (tecla_pulsada.c==0)
  197.             {
  198.             switch(tecla_pulsada.i)
  199.                 {
  200.                 case F3:
  201.                     repone_config();
  202.                     break;
  203.  
  204.                 case F2:
  205.                     guarda_config();
  206.                     break;
  207.  
  208.                 case F8:
  209.                     graba_dibujo();
  210.                     break;
  211.  
  212.                 case F10:
  213.                     putimage(1,465,limpia_texto,0);
  214.                     setcolor(11);
  215.                     outtextxy(1,466,"  ¿Realmente desea salir?...");
  216.                     setcolor(9);
  217.                     outtextxy(1,466,"                                F10-Salir al DOS    ESCAPE-Cancelar Operación  ");
  218.                     while ((tecla_pulsada.i=bioskey(0))!=ESCAPE)
  219.                         {
  220.                         if (tecla_pulsada.i==F10)
  221.                             salida("¡Hasta pronto!\n\n");
  222.                         else
  223.                             putch('\a');
  224.                         };
  225.                     putimage(1,465,limpia_texto,0);
  226.                     outtextxy(1,466," F2-Guardar  F3-Reponer  F5-Elegir Mirilla  F8-Grabar Imágen  F10-Salir al DOS");
  227.                     break;
  228.  
  229.                 case F5:
  230.                     putimage(1,465,limpia_texto,0);
  231.                     outtextxy(1,466,"  CURSORES-Mover la Mirilla    INTRO-Presentar la imágen     ESCAPE-Cancelar  ");
  232.                     rectangle(x_ventana+x_rec-1,y_ventana+y_rec-1,x_ventana+x_rec+21,y_ventana+y_rec+21);
  233.                     while ((tecla_pulsada.i=bioskey(0))!=INTRO)
  234.                         {
  235.                         if (tecla_pulsada.c==0)
  236.                             {
  237.                             rectangle(x_ventana+x_rec-1,y_ventana+y_rec-1,x_ventana+x_rec+21,y_ventana+y_rec+21);
  238.                             switch(tecla_pulsada.i)
  239.                                 {
  240.                                 case CURSOR_ARRIBA:
  241.                                     if(y_rec>1) --y_rec;
  242.                                     break;
  243.                                 case CURSOR_DERECHA:
  244.                                     if(x_rec<178) ++x_rec;
  245.                                     break;
  246.                                 case CURSOR_ABAJO:
  247.                                     if(y_rec<178) ++y_rec;
  248.                                     break;
  249.                                 case CURSOR_IZQUIERDA:
  250.                                     if(x_rec>1) --x_rec;
  251.                                     break;
  252.                                 default:
  253.                                     putch('\a');
  254.                                     break;
  255.                                 };
  256.                             rectangle(x_ventana+x_rec-1,y_ventana+y_rec-1,x_ventana+x_rec+21,y_ventana+y_rec+21);
  257.                             }
  258.                         else
  259.                             if ((tecla_pulsada.i!=INTRO)&&(tecla_pulsada.i!=ESCAPE))
  260.                                 putch('\a');
  261.                         if (tecla_pulsada.i==ESCAPE)
  262.                             {
  263.                             rectangle(x_ventana+x_rec-1,y_ventana+y_rec-1,x_ventana+x_rec+21,y_ventana+y_rec+21);
  264.                             putimage(1,465,limpia_texto,0);
  265.                             outtextxy(1,466," F2-Guardar  F3-Reponer  F5-Elegir Mirilla  F8-Grabar Imágen  F10-Salir al DOS");
  266.                             break;
  267.                             };
  268.                         };
  269.                 switch(tecla_pulsada.i)
  270.                     {
  271.                     case ESCAPE:
  272.                     case INTRO:
  273.                         break;
  274.                     default:
  275.                         putch('\a');
  276.                         break;
  277.                     };
  278.                 };
  279.             };
  280.     if (tecla_pulsada.i==INTRO)
  281.             {
  282.             bucle++;
  283.             x_rec++;     /*Ajuste para representar la mirilla exactamente.*/
  284.             y_rec++;
  285.             if (bucle>30)
  286.                 {
  287.                 setcolor(11);
  288.                 putimage(1,465,limpia_texto,0);
  289.                 outtextxy(1,466,"       Ha alcanzado el máximo de 30 imágenes que permite el programa. ");
  290.         putch('\a');
  291.                 delay(2500);
  292.                 setcolor(9);
  293.                 rectangle(x_ventana+x_rec-2,y_ventana+y_rec-2,x_ventana+x_rec+20,y_ventana+y_rec+20);
  294.         tecla_pulsada.i=ESCAPE;
  295.                 putimage(1,465,limpia_texto,0);
  296.                 outtextxy(1,466," F2-Guardar  F3-Reponer  F5-Elegir Mirilla  F8-Grabar Imágen  F10-Salir al DOS");
  297.                 }
  298.             else
  299.                 {
  300.                 itoa(bucle,bucle_cad,10);
  301.                 putimage(1,8,limpia_texto,0);
  302.                 outtextxy(1,9,"  Imágen nº                                 FRACTAL    Javier Trujillo-1992");
  303.                 outtextxy(100,9,bucle_cad);
  304.                 rectangle(x_ventana+5,y_ventana+204,x_ventana+9,y_ventana+208);
  305.                 if (bucle<31)
  306.                     break;
  307.                 };
  308.             }
  309.         else
  310.             {
  311.             switch(tecla_pulsada.i)
  312.                 {
  313.                 case ESCAPE:
  314.                 case 0:
  315.                     break;
  316.                 default:
  317.                     putch ('\a');
  318.                 };
  319.             };
  320.         };
  321.  
  322.  
  323. /***************************************************************************/
  324. /* reajusta algunas variables con nuevos valores para otra representación  */
  325. /***************************************************************************/
  326.  
  327.  
  328.     x_margen=x_margen+(x_rec/ajuste_punto);
  329.     y_margen=y_margen+(y_rec/ajuste_punto);
  330.  
  331.     intervalo/=10;
  332.     ajuste_punto*=10;
  333.  
  334.  
  335. /***************************************************************************/
  336. /******* Proporciona las coordenadas de cada una de las 6 ventanas *********/
  337. /***************************************************************************/
  338.  
  339.  
  340.     switch(cuenta_vueltas)
  341.         {
  342.         case 0:
  343.             x_ventana=5;y_ventana=30;break;
  344.         case 1:
  345.             x_ventana=215;y_ventana=30;break;
  346.         case 2:
  347.             x_ventana=425;y_ventana=30;break;
  348.         case 3:
  349.             x_ventana=5;y_ventana=250;break;
  350.         case 4:
  351.             x_ventana=215;y_ventana=250;break;
  352.         case 5:
  353.             x_ventana=425;y_ventana=250;cuenta_vueltas=-1;break;
  354.         };
  355.  
  356.     ++cuenta_vueltas;
  357.     rectangle(x_ventana+5,y_ventana+204,x_ventana+9,y_ventana+208);
  358.  
  359.  
  360. /***************************************************************************/
  361. /* gestiona la representación de cada pixel de una imagen con un bucle    */
  362. /***************************************************************************/
  363.  
  364.  
  365.     putimage(1,465,limpia_texto,0);
  366.     outtextxy(1,466,"            Creando una nueva imágen...         F4-Interrumpir Creación    ");
  367.     x_coord=0;
  368.     for (x_pixel=0; x_pixel<200; x_pixel++)
  369.         {
  370.         x_coord+=intervalo;
  371.         y_coord=0;
  372.         for (y_pixel=0; y_pixel<200; y_pixel++)
  373.             {
  374.             y_coord+=intervalo;
  375.             conta_color=0;
  376.             x_result=0;
  377.             y_result=0;
  378.             do
  379.                 {
  380.                 if (kbhit())
  381.                     {
  382.                     tecla_pulsada.i=bioskey(0);
  383.                     if (tecla_pulsada.c==0)
  384.                         {
  385.                         if (tecla_pulsada.i==F4)
  386.                             {
  387.                             putimage(1,465,limpia_texto,0);
  388.                             outtextxy(1,466,"  F4-Interrumpir creación     F10-Salir al DOS     ESCAPE-Cancelar operación");
  389.                             while ((tecla_pulsada.i=bioskey(0))!=ESCAPE)
  390.                                 {
  391.                                 if(tecla_pulsada.c==0)
  392.                                     {
  393.                                     switch(tecla_pulsada.i)
  394.                                         {
  395.                                         case F4:
  396.                                             goto rompe_bucle;
  397.                                         case F10:
  398.                                             putimage(1,465,limpia_texto,0);
  399.                                             setcolor(11);
  400.                                             outtextxy(1,466,"  ¿Realmente desea salir?...");
  401.                                             setcolor(9);
  402.                                             outtextxy(1,466,"                                F10-Salir al DOS    ESCAPE-Cancelar Operación  ");
  403.                                             while ((tecla_pulsada.i=bioskey(0))!=ESCAPE)
  404.                                                 {
  405.                                                 if (tecla_pulsada.i==F10)
  406.                                                     salida("¡Hasta pronto!\n\n");
  407.                                                 else
  408.                                                     putch('\a');
  409.                                                 };
  410.                                             break;
  411.                                         default:
  412.                                             putch('\a');
  413.                                             break;
  414.                                         };
  415.                                     }else
  416.                                         putch('\a');
  417.                                 if (tecla_pulsada.i==ESCAPE)
  418.                                     break;
  419.                                 };
  420.                             putimage(1,465,limpia_texto,0);
  421.                             outtextxy(1,466,"            Creando una nueva imágen...          F4-Interrumpir Creación    ");
  422.                             }else
  423.                                 putch('\a');
  424.                         }else
  425.                             putch('\a');
  426.                     };
  427.                 conta_color++;
  428.                 x_dato=((x_result*x_result)-(y_result*y_result)+x_margen+x_coord);
  429.                 y_dato=((2*x_result*y_result)+y_margen+y_coord);
  430.                 x_result=x_dato;
  431.                 y_result=y_dato;
  432.                 }while(((!(x_result<-2)) && (!(x_result>2))) && ((!(y_result<-2)) && (!(y_result>2)) && (conta_color<num)));
  433.             putpixel(x_pixel+x_ventana,y_pixel+y_ventana,fmod(conta_color,16)+2);
  434.             };
  435.         };
  436. rompe_bucle:;
  437.     };
  438.  
  439. }
  440.  
  441.  
  442. /***************************************************************************/
  443. /* Contiene la función graba_dibujo que permite la captura de una imagen  */
  444. /***************************************************************************/
  445.  
  446.  
  447. void graba_dibujo(void)
  448. {
  449.  
  450. char
  451.     nombre[13]={'\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0'},
  452.     borra_ch[90];  /*Mantienen nombre del fichero y borrado de caracteres.*/
  453.  
  454. register
  455.     x_imagen=2,    /*Coordenadas de la imagen a guardar.*/
  456.     y_imagen=27;
  457.  
  458. int
  459.     n=0,           /*Guarda el caracter pulsado del nombre.*/
  460.     x=375,         /*Guarda la posición de los caracteres.*/
  461.     fin=0;         /*Gestiona el fin de entrada del nombre.*/
  462.  
  463. long
  464.     num_bytes;     /*Número de bytes que quedan en disco.*/
  465.  
  466. struct
  467.  dfree disco;    /*Espacio en el disco.*/
  468.  
  469. struct
  470.  ffblk buscar;   /*Primer archivo de igual nombre.*/
  471.  
  472. /***************************************************************************/
  473.  
  474. putimage(1,465,limpia_texto,0);
  475. outtextxy(1,466,"  CURSORES-Mover la Ventana  INTRO-Grabar Imágen en Disco   ESCAPE-Cancelar  ");
  476.  
  477. setcolor(15);
  478. rectangle(x_imagen,y_imagen,x_imagen+205,y_imagen+205);
  479. while((tecla_pulsada.i=bioskey(0))!=INTRO)
  480.     {
  481.     if (tecla_pulsada.c==0)
  482.         {
  483.         rectangle(x_imagen,y_imagen,x_imagen+205,y_imagen+205);
  484.             switch(tecla_pulsada.i)
  485.                 {
  486.                 case CURSOR_ARRIBA:
  487.                     if(y_imagen>100)
  488.                         y_imagen-=220;
  489.                     else
  490.                         BEEP_CORTO;
  491.                     break;
  492.  
  493.                 case CURSOR_DERECHA:
  494.                     if(x_imagen<400)
  495.                         x_imagen+=210;
  496.                     else
  497.                         BEEP_CORTO;
  498.                     break;
  499.  
  500.                 case CURSOR_ABAJO:
  501.                     if(y_imagen<100)
  502.                         y_imagen+=220;
  503.                     else
  504.                         BEEP_CORTO;
  505.                     break;
  506.  
  507.                 case CURSOR_IZQUIERDA:
  508.                     if(x_imagen>100)
  509.                         x_imagen-=210;
  510.                     else
  511.                         BEEP_CORTO;
  512.                     break;
  513.  
  514.                 default:
  515.                     putch('\a');
  516.                     break;
  517.                 };
  518.                 rectangle(x_imagen,y_imagen,x_imagen+205,y_imagen+205);
  519.         }
  520.     else
  521.         if(tecla_pulsada.i==ESCAPE)
  522.             break;
  523.         else
  524.             putch('\a');
  525.     };
  526.  
  527. rectangle(x_imagen,y_imagen,x_imagen+205,y_imagen+205);
  528. getimage(x_imagen+3,y_imagen+3,x_imagen+202,y_imagen+202,frac);
  529.  
  530. /***************************************************************************/
  531.  
  532.  
  533. setcolor(9);
  534.  
  535. if (tecla_pulsada.i!=ESCAPE)
  536.     {
  537.     putimage(1,465,limpia_texto,0);
  538.     getimage(375,465,383,475,borra_ch);
  539.     outtextxy(1,466," Escriba el nombre del archivo y pulse INTRO:          .img   ESCAPE-Cancelar");
  540.     setcolor(11);
  541.     do
  542.         {
  543.         tecla_pulsada.i = bioskey(0);
  544.         if ((n < 8)&&(isalnum(tecla_pulsada.c)))
  545.             {
  546.             nombre[n] = tecla_pulsada.c;        /* Caracter normal                   */
  547.             outtextxy(x,466,&nombre[n]);
  548.             n++;
  549.             x+=8;
  550.             }
  551.         else
  552.             {
  553.             switch (tecla_pulsada.i)
  554.                 {
  555.                 case INTRO:               /* Vuelta de carro o escape          */
  556.                     if (n!=0)
  557.                         fin =1;
  558.                     else
  559.                         putch('\a');
  560.                     break;
  561.  
  562.               case ESCAPE:
  563.                     fin = 1;              /* Fin de entrada                    */
  564.                     break;
  565.  
  566.               case RETROCEDER:             /* Espacio-atras                     */
  567.                     if (x>375)
  568.                         {
  569.                         x-=8;
  570.                         putimage(x,465,borra_ch,0);
  571.                         nombre[n]='\0';
  572.                         n--;
  573.                         }
  574.                     else
  575.                         putch('\a');
  576.                     break;
  577.  
  578.               default:
  579.                     putch('\a');
  580.                 };
  581.             };
  582.         } while (!fin);
  583.  
  584.     if (tecla_pulsada.i==INTRO)
  585.         {
  586.         nombre[n]='.';
  587.         nombre[n+1]='i';
  588.         nombre[n+2]='m';
  589.         nombre[n+3]='g';
  590.         nombre[n+4]='\0';
  591.         if (!findfirst(nombre,&buscar,0))
  592.             {
  593.             putimage(1,465,limpia_texto,0);
  594.             outtextxy(1,466," Ya existe un fichero con ese nombre.");
  595.             putch('\a');
  596.             setcolor(9);
  597.             outtextxy(1,466,"                                        INTRO-Sobreescribir  ESCAPE-Cancelar");
  598.             delay(2000);
  599.             setcolor(11);
  600.             for(;;)
  601.                 {
  602.                 tecla_pulsada.i=bioskey(0);
  603.                 switch(tecla_pulsada.i)
  604.                     {
  605.                     case INTRO:
  606.                     case ESCAPE:
  607.                         break;
  608.                     default:
  609.                         putch('\a');
  610.                     };
  611.                 if ((tecla_pulsada.i==INTRO)||(tecla_pulsada.i==ESCAPE))
  612.                     break;
  613.                 };
  614.             }
  615.         else
  616.             {
  617.             getdfree(0,&disco);
  618.             num_bytes=(long)disco.df_avail*(long)disco.df_sclus*(long)disco.df_bsec;
  619.             if (num_bytes<20006)
  620.                 {
  621.                 putimage(1,465,limpia_texto,0);
  622.                 outtextxy(1,466,"  Espacio insuficiente en el disco para guardar una nueva imágen seleccionada.");
  623.                 putch('\a');
  624.                 delay(2500);
  625.                 tecla_pulsada.i=0;
  626.                 };
  627.             };
  628.  
  629.         if (tecla_pulsada.i==INTRO)
  630.             {
  631.             num_char=(imagesize(0,0,199,199)/sizeof(char));
  632.             if((archivo=fopen(nombre,"wb"))==NULL)
  633.                 salida("No se puede crear el fichero de la imágen seleccionada.\n\n");
  634.             fwrite(frac, sizeof(char) ,num_char,archivo);
  635.             fclose(archivo);
  636.             };
  637.         };
  638.     setcolor(9);
  639.     };
  640. putimage(1,465,limpia_texto,0);
  641. outtextxy(1,466," F2-Guardar  F3-Reponer  F5-Elegir Mirilla  F8-Grabar Imágen  F10-Salir al DOS");
  642. tecla_pulsada.i=0;
  643. }
  644.  
  645.  
  646. /**************************************************************************/
  647. /**** Función que guarda la situación del programa en un momento dado *****/
  648. /**************************************************************************/
  649.  
  650.  
  651. void guarda_config(void)
  652. {
  653.  
  654. char
  655.     nombre[13]={'\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0'},
  656.     borra_ch[90];  /*Mantienen nombre del fichero y borrado de caracteres.*/
  657.  
  658. int
  659.     n=0,           /*Guarda el caracter pulsado del nombre.*/
  660.     x=375,         /*Guarda la posición de los caracteres.*/
  661.     fin=0;         /*Gestiona el fin de entrada del nombre.*/
  662.  
  663. long
  664.     num_bytes;     /*Número de bytes que quedan en disco.*/
  665.  
  666. struct
  667.  dfree disco;         /*Espacio en el disco.*/
  668.  
  669. struct
  670.  ffblk buscar;   /*Primer archivo de igual nombre.*/
  671.  
  672. /***************************************************************************/
  673.  
  674.  
  675. putimage(1,465,limpia_texto,0);
  676. getimage(375,465,383,475,borra_ch);
  677. outtextxy(1,466," Escriba el nombre del archivo y pulse INTRO:          .frc   ESCAPE-Cancelar");
  678.  
  679. setcolor(11);
  680. do
  681.     {
  682.     tecla_pulsada.i = bioskey(0);
  683.     if ((n < 8)&&(isalnum(tecla_pulsada.c)))
  684.         {
  685.         nombre[n] = tecla_pulsada.c;        /* Caracter normal                   */
  686.         outtextxy(x,466,&nombre[n]);
  687.         n++;
  688.         x+=8;
  689.         }
  690.     else
  691.         {
  692.         switch (tecla_pulsada.i)
  693.             {
  694.             case INTRO:               /* Vuelta de carro o escape          */
  695.                 if (n!=0)
  696.                     fin = 1;
  697.                 else
  698.                     putch('\a');
  699.                 break;
  700.  
  701.             case ESCAPE:
  702.                 fin = 1;              /* Fin de entrada                    */
  703.                 break;
  704.  
  705.             case RETROCEDER:             /* Espacio-atras                     */
  706.                 if (x>375)
  707.                     {
  708.                     x-=8;
  709.                     putimage(x,465,borra_ch,0);
  710.                     nombre[n]='\0';
  711.                     n--;
  712.                     }
  713.                 else
  714.                     putch('\a');
  715.                 break;
  716.  
  717.             default:
  718.                 putch('\a');
  719.             };
  720.         };
  721.     } while (!fin);
  722.  
  723. if (tecla_pulsada.i==INTRO)
  724.     {
  725.     nombre[n]='.';
  726.     nombre[n+1]='f';
  727.     nombre[n+2]='r';
  728.     nombre[n+3]='c';
  729.     nombre[n+4]='\0';
  730.     if (!findfirst(nombre,&buscar,0))
  731.         {
  732.         putimage(1,465,limpia_texto,0);
  733.         outtextxy(1,466," Ya existe un fichero con ese nombre.");
  734.         setcolor(9);
  735.         outtextxy(1,466,"                                        INTRO-Sobreescribir  ESCAPE-Cancelar");
  736.         putch('\a');
  737.         delay(2000);
  738.         setcolor(11);
  739.         for(;;)
  740.             {
  741.             tecla_pulsada.i=bioskey(0);
  742.             switch(tecla_pulsada.i)
  743.                 {
  744.                 case INTRO:
  745.                 case ESCAPE:
  746.  
  747.                     break;
  748.                 default:
  749.                     putch('\a');
  750.                 };
  751.             if ((tecla_pulsada.i==INTRO)||(tecla_pulsada.i==ESCAPE))
  752.                 break;
  753.             };
  754.         }
  755.     else
  756.         {
  757.         getdfree(0,&disco);
  758.         num_bytes=((long)disco.df_avail*(long)disco.df_sclus*(long)disco.df_bsec);
  759.         if (num_bytes<120076)
  760.             {
  761.             putimage(1,465,limpia_texto,0);
  762.             outtextxy(1,466,"   Espacio insuficiente en el disco para guardar un nuevo archivo de trabajo.");
  763.             putch('\a');
  764.             delay(2500);
  765.             tecla_pulsada.i=0;
  766.             };
  767.         };
  768.  
  769.     if (tecla_pulsada.i==INTRO)
  770.         {
  771.         num_char=(imagesize(0,0,199,199)/sizeof(char));
  772.         if((archivo=fopen(nombre,"wb"))==NULL)
  773.             salida("No se puede crear el fichero que guarda el trabajo pendiente.\n\n");
  774.  
  775.         fwrite(&bucle, sizeof(int) ,1,archivo);
  776.  
  777.     fwrite(&cuenta_vueltas, sizeof(int) ,1,archivo);
  778.  
  779.         fwrite(&intervalo, sizeof(double) ,1,archivo);
  780.  
  781.         fwrite(&x_margen, sizeof(double) ,1,archivo);
  782.  
  783.         fwrite(&y_margen, sizeof(double) ,1,archivo);
  784.  
  785.         fwrite(&ajuste_punto, sizeof(double) ,1,archivo);
  786.  
  787.         fwrite(&x_ventana, sizeof(int) ,1,archivo);
  788.  
  789.         fwrite(&y_ventana, sizeof(int) ,1,archivo);
  790.  
  791.         getimage(5,30,204,229,frac);
  792.         fwrite(frac, sizeof(char) ,num_char,archivo);
  793.  
  794.         getimage(215,30,414,229,frac);
  795.         fwrite(frac, sizeof(char) ,num_char,archivo);
  796.  
  797.         getimage(425,30,624,229,frac);
  798.         fwrite(frac, sizeof(char) ,num_char,archivo);
  799.  
  800.         getimage(5,250,204,449,frac);
  801.         fwrite(frac, sizeof(char) ,num_char,archivo);
  802.  
  803.         getimage(215,250,414,449,frac);
  804.         fwrite(frac, sizeof(char) ,num_char,archivo);
  805.  
  806.         getimage(425,250,624,449,frac);
  807.         fwrite(frac, sizeof(char) ,num_char,archivo);
  808.  
  809.         fclose(archivo);
  810.         };
  811.     };
  812. setcolor(9);
  813. putimage(1,465,limpia_texto,0);
  814. outtextxy(1,466," F2-Guardar  F3-Reponer  F5-Elegir Mirilla  F8-Grabar Imágen  F10-Salir al DOS");
  815. tecla_pulsada.i=0;
  816. }
  817.  
  818. /***************************************************************************/
  819. /****** Función que repone un trabajo grabado anteriormente ****************/
  820. /***************************************************************************/
  821.  
  822.  
  823. void repone_config(void)
  824. {
  825.  
  826. char
  827.     nombre[13]={'\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0'},
  828.     borra_ch[90];  /*Mantienen nombre del fichero y borrado de caracteres.*/
  829.  
  830. int
  831.     n=0,           /*Guarda el caracter pulsado del nombre.*/
  832.     x=375,         /*Guarda la posición de los caracteres.*/
  833.     fin=0;         /*Gestiona el fin de entrada del nombre.*/
  834.  
  835. /***************************************************************************/
  836.  
  837.  
  838. putimage(1,465,limpia_texto,0);
  839. getimage(375,465,383,475,borra_ch);
  840. outtextxy(1,466," Escriba el nombre del archivo y pulse INTRO:          .frc   ESCAPE-Cancelar");
  841. setcolor(11);
  842.  
  843. do
  844.     {
  845.     tecla_pulsada.i = bioskey(0);
  846.     if ((n < 8)&&(isalnum(tecla_pulsada.c)))
  847.         {
  848.         nombre[n] = tecla_pulsada.c;        /* Caracter normal                   */
  849.         outtextxy(x,466,&nombre[n]);
  850.         n++;
  851.         x+=8;
  852.         }
  853.     else
  854.         {
  855.         switch (tecla_pulsada.i)
  856.             {
  857.             case INTRO:               /* Vuelta de carro o escape          */
  858.                 if (n!=0)
  859.                     fin=1;
  860.                 else
  861.                     putch('\a');
  862.                 break;
  863.  
  864.             case ESCAPE:
  865.                 fin = 1;              /* Fin de entrada                    */
  866.                 break;
  867.  
  868.             case RETROCEDER:             /* Espacio-atras                     */
  869.                 if (x>375)
  870.                     {
  871.                     x-=8;
  872.                     putimage(x,465,borra_ch,0);
  873.                     nombre[n]='\0';
  874.                     n--;
  875.  
  876.                     }
  877.                 else
  878.                     putch('\a');
  879.                 break;
  880.  
  881.             default:
  882.                 putch('\a');
  883.                 break;
  884.             };
  885.         };
  886.     } while (!fin);
  887.  
  888. if (tecla_pulsada.i==INTRO)
  889.     {
  890.     nombre[n]='.';
  891.     nombre[n+1]='f';
  892.     nombre[n+2]='r';
  893.     nombre[n+3]='c';
  894.     nombre[n+4]='\0';
  895.  
  896.     num_char=(imagesize(0,0,199,199)/sizeof(char));
  897.  
  898.     if((archivo=fopen(nombre,"rb"))==NULL)
  899.         {
  900.         putimage(1,465,limpia_texto,0);
  901.         outtextxy(1,466,"       El fichero seleccionado no existe o esta dañado, pruebe de nuevo.");
  902.         putch('\a');
  903.         delay(2000);
  904.         }
  905.     else
  906.         {
  907.         setcolor(9);
  908.         rectangle(x_ventana+5,y_ventana+204,x_ventana+9,y_ventana+208);
  909.         setcolor(11);
  910.         fread(&bucle,sizeof(int) ,1,archivo);
  911.  
  912.         fread(&cuenta_vueltas,sizeof(int) ,1,archivo);
  913.  
  914.         fread(&intervalo, sizeof(double) ,1,archivo);
  915.  
  916.         fread(&x_margen, sizeof(double) ,1,archivo);
  917.  
  918.         fread(&y_margen, sizeof(double) ,1,archivo);
  919.  
  920.         fread(&ajuste_punto, sizeof(double) ,1,archivo);
  921.  
  922.         fread(&x_ventana, sizeof(int) ,1,archivo);
  923.  
  924.         fread(&y_ventana, sizeof(int) ,1,archivo);
  925.  
  926.         fread(frac, sizeof(char) ,num_char,archivo);
  927.         putimage(5,30,frac,0);
  928.  
  929.         fread(frac, sizeof(char) ,num_char,archivo);
  930.         putimage(215,30,frac,0);
  931.  
  932.         fread(frac, sizeof(char) ,num_char,archivo);
  933.         putimage(425,30,frac,0);
  934.  
  935.         fread(frac, sizeof(char) ,num_char,archivo);
  936.         putimage(5,250,frac,0);
  937.  
  938.         fread(frac, sizeof(char) ,num_char,archivo);
  939.         putimage(215,250,frac,0);
  940.  
  941.         fread(frac, sizeof(char) ,num_char,archivo);
  942.         putimage(425,250,frac,0);
  943.  
  944.         fclose(archivo);
  945.  
  946.         setcolor(9);
  947.         itoa(bucle,bucle_cad,10);
  948.         putimage(1,8,limpia_texto,0);
  949.         outtextxy(1,9,"  Imágen nº                                 FRACTAL    Javier Trujillo-1992");
  950.         outtextxy(100,9,bucle_cad);
  951.         rectangle(x_ventana+5,y_ventana+204,x_ventana+9,y_ventana+208);
  952.     };
  953.     };
  954. setcolor(9);
  955. putimage(1,465,limpia_texto,0);
  956. outtextxy(1,466," F2-Guardar  F3-Reponer  F5-Elegir Mirilla  F8-Grabar Imágen  F10-Salir al DOS");
  957. tecla_pulsada.i=0;
  958. }
  959.  
  960. /***************************************************************************/
  961. /************** Función que gestiona la salida del programa ****************/
  962. /***************************************************************************/
  963.  
  964. void salida(char texto [80]){
  965.  
  966. restorecrtmode();
  967. clrscr();
  968. printf(texto);
  969. exit(0);
  970.  
  971. }
  972.  
  973.  
  974. /***************************************************************************/
  975. /*************************      FIN DE FICHERO      ************************/
  976. /***************************************************************************/